package com.example.kotlindemo

import java.util.*
import kotlin.text.StringBuilder

/**
 * @功能:
 * @Creat 2020/4/12 9:03
 * @User Lmy
 * @Compony JinAnChang
 */


/**
 *顶层方法 无需实例化对象即可调用(静态方法)
 *
 */
fun dosmosing() {
    println("我是KotlinDemo中的dosmosing顶层方法")
}

fun main() {
    val list = listOf<String>("A", "B")
    val builder = StringBuilder()
    builder.append("开始吃水果\n")
    for (test in list) {
        builder.append(test).append("\n")
    }
    builder.append("水果吃完了\n")
    print(builder.toString())
    //with函数主要接受两个参数值  第一个任意类型的对象 第二个是lambda表达式
    val result = with(StringBuilder()) {
        //这里是StringBuilder上下文 可以直接调用StringBuilder的方法
        append("with开始吃水果\n")
        for (test in list) {
            append(test).append("\n")
        }
        append("with水果吃完了\n").toString()
    }
    println(result)


    val withdemo = with(String()) {
        "这是with函数返回的值"
    }
    println("with函数的用法：$withdemo")

    val rundemo = String.run {
        "run这是run函数的用法"
    }
    /**
     * run 函数无法被直接调用需要 object.run()来调用
     *
     */
    println("run函数的用法：$rundemo")


    val resultrun = StringBuilder().run {
        append("run开始吃水果\n")
        for (test in list) {
            append(test).append("\n")
        }
        append("run水果吃完了\n").toString()
    }
    println(resultrun)
    val resultapply = StringBuilder().apply {
        append("apply开始吃水果\n")
        for (test in list) {
            append(test).append("\n")
        }
        append("apply水果吃完了\n")
    }
    //这里需要注意apply函数无法指定返回值
    // 只能返回调用对象的本身
    // 因此需要对resultapply进行tostring
    //run函数是指定返回的值的可以返回
    println(resultapply.toString())
}